/*
 * @lc app=leetcode.cn id=671 lang=java
 *
 * [671] 二叉树中第二小的节点
 *
 * https://leetcode-cn.com/problems/second-minimum-node-in-a-binary-tree/description/
 *
 * algorithms
 * Easy (44.66%)
 * Likes:    55
 * Dislikes: 0
 * Total Accepted:    6.5K
 * Total Submissions: 14.5K
 * Testcase Example:  '[2,2,5,null,null,5,7]'
 *
 * 给定一个非空特殊的二叉树，每个节点都是正数，并且每个节点的子节点数量只能为 2 或
 * 0。如果一个节点有两个子节点的话，那么这个节点的值不大于它的子节点的值。 
 *
 * 给出这样的一个二叉树，你需要输出所有节点中的第二小的值。如果第二小的值不存在的话，输出 -1 。
 *
 * 示例 1:
 *
 *
 * 输入:
 * ⁠   2
 * ⁠  / \
 * ⁠ 2   5
 * ⁠    / \
 * ⁠   5   7
 *
 * 输出: 5
 * 说明: 最小的值是 2 ，第二小的值是 5 。
 *
 *
 * 示例 2:
 *
 *
 * 输入:
 * ⁠   2
 * ⁠  / \
 * ⁠ 2   2
 *
 * 输出: -1
 * 说明: 最小的值是 2, 但是不存在第二小的值。
 *
 *
 */

// @lc code=start
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public int findSecondMinimumValue(TreeNode root) {
        if(root == null)
            return 0;
        int min = fun(root);
        return min == root.val ? -1 : min;
    }

    int fun (TreeNode root) {
        if(root.left == null && root.right == null) {
            return root.val;
        }

        int min = Math.min(root.left.val, root.right.val);
        if(min == root.val) {
            return Math.min(fun(root.left), fun(root.right));
        }

        return min;
    }
}
// @lc code=end

